package org.xurui.bsj.protocol.command.impl;

import org.hswebframework.web.bean.FastBeanCopier;
import org.jetlinks.core.message.DeviceMessage;
import org.jetlinks.core.message.codec.FromDeviceMessageContext;
import org.jetlinks.core.message.event.EventMessage;
import org.xurui.bsj.protocol.command.CmdCodec;
import org.xurui.bsj.protocol.enums.CommandEnum;
import org.xurui.bsj.protocol.msg.BsjMessage;
import org.xurui.bsj.protocol.utils.ArrayUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 4.3.3. 呼入号码获取
 */
public class CmdCodec_GET_INCOMING_CALL implements CmdCodec {
    @Override
    public boolean supportsCmd(String cmd) {
        return CommandEnum.GET_INCOMING_CALL.name().equals(cmd);
    }

    @Override
    public List<DeviceMessage> parsePayload(BsjMessage payload, FromDeviceMessageContext context) {
        //例子：[861755052699870,89860000192198904130,202110111628470003,GET_INCOMING_CALL,3,20211011162847,1,1]
        /**
         * 报文体格式：1
         */
        //设备上报事件
        EventMessage eventMessage = new EventMessage();
        eventMessage.setDeviceId(payload.getHeader().getDeviceNo());
        eventMessage.setEvent(payload.getHeader().getCmd());
        eventMessage.setMessageId(payload.getHeader().getOrderNo());
        eventMessage.setTimestamp(System.currentTimeMillis());
        Map<String, Object> properties = new HashMap<>();
        String tempBody = payload.getTempBody();
        String[] tempBodyArr = tempBody.split("@");
        //properties.put("header", FastBeanCopier.copy(payload.getHeader(), HashMap::new));
        properties.put("header", payload.getHeader().toMap());

        /**
         * incomingCall
         */
        properties.put("incomingCall", ArrayUtils.getStrByIndex(tempBodyArr,0));
        eventMessage.setData(properties);

        //回复消息
        //标识通信方向，取值如下: 1.下发请求 2.下发响应 3.上报请求 4.上报响应
        //说明：平台下发请求标示 1，则终 端响应标示为 2，终端上报接口标 示为 3，平台响应标示为 4
        //组装需要回复设备消息提
        /**
         * 报文体格式： 删除号码@添加号码和时段@呼入限制@周期
         * 字段说明：
         * 无删除号码或者无添加号码可用 0 代替
         * 例如
         * 0@13900000004=0600-2230+!@呼入限制@周期
         * 13900000004@0@呼入限制@周期
         * 最多允许 20 个白名单用户; 每个白名单号码允许设置两个呼入时段
         * 删除号码和时段(呼入号码)
         * 删除的时候，会将 2 个时段内的数据全部删除添加号码和时段(呼入号码=开始时间-结束时
         * 间+开始时间-结束时间+)
         * 13900000000!13900000001!13900000002!139
         * 00000003!@13900000004=0600-2230+!139000
         * 00005=0900-1130+!
         * 呼入限制：1 无限制 2 限制白名单以外的号码呼入 3 限制所有号码呼入
         * 周期：周一至周六用 1-6 表示，周日用 0 表示，
         * 如 1+2+3+4+表示周一至周四
         * 异常应答:0 无设置 1 非平台用户 2 其他异常
         */
        //示例：[861755052699870,89860000192198904130,202110111628470003,GET_INCOMING_CALL,4,20211011162848,61,15625730592!@15625730595=0000-2359+0000-2359!@2@0+1+2+3+4+5+6]
        //TODO 设备请求 响应报文定义
        payload.setTempReplyBody("0");
        return genDeviceMessage(eventMessage);
    }
}
